# Написать программу, которая выводит на экране консоли символ "*", и этот символ "движется" от левого края к правому; на краю консоли программа останавливается.
#  "Движение" — это вывод по координатам (x+1, y) символа "*", а затем вывод по координатам (x, y) пробела.
#  Движение происходит согласно таймерному прерыванию (используется и консоль, и Timer Tool)
#  Таймер медленный — не чаще 5 раз в секунду 

.data
yes_t: .byte 0

.text
.globl main
main:
	li      t0 1
        sb      t0 0xffff0008 t1
	li	s0 0			# Положение курсора X
	li	a0 0			# Получим случайное положение курсора, для Y
	li	a1 12		
	li	a7 42
	ecall
	mv	s1 a0
	slli	s1 s1 8
	li	s2 117			# Граница X		
	li	s3 '*'
	li	s4 ' '
        
        lw      t0 0xffff0018		# Настроим прерывание
        addi    t0 t0 1
        sw      t0 0xffff0020 t1
        la      t0 handler
        csrw    t0 utvec
        csrwi   uie 0x10
        csrwi   ustatus 1

loop:	lb	t0 yes_t		# Пошел вывод
	beqz    t0 loop
	
loopсur:
	lb      t0 0xffff0008           # готовность вывода
        andi    t0 t0 1                 # есть?
        beqz    t0 loopсur	        # а надо! идём обратно
        slli	t0 s0 20
	add	t0 t0 s1
	addi	t0 t0 7	
        sw      t0 0xffff000c t1        # запишем слово
loopchar:       
        lb      t0 0xffff0008           # готовность вывода
        andi    t0 t0 1                 # есть?
        beqz    t0 loopchar	        # а надо! идём обратно
        sb      s3 0xffff000c t1        # запишем байт	
	
loopсur_:
	lb      t0 0xffff0008           # готовность вывода
        andi    t0 t0 1                 # есть?
        beqz    t0 loopсur_	        # а надо! идём обратно
        addi	t0 s0 -1
        slli	t0 t0 20
	add	t0 t0 s1
	addi	t0 t0 7	
        sw      t0 0xffff000c t1        # запишем слово
loopchar_:       
        lb      t0 0xffff0008           # готовность вывода
        andi    t0 t0 1                 # есть?
        beqz    t0 loopchar_	        # а надо! идём обратно
        sb      s4 0xffff000c t1        # запишем байт
        
        addi	s0 s0 1			# Увеличим X
         
        bge	s0 s2 Ending		# Если дошли до края экрана, то конец
	sb	zero yes_t t1        
	b       loop
	
Ending: li      a7 10
        ecall
	
	
handler:
	csrw	t0 uscratch
	li	t0 1			# Установим признак срабатывания таймера
	sb	t0 yes_t t1
	lw      t0 0xffff0018		# Добавим время для следующего прерывания
        addi    t0 t0 20
        sw      t0 0xffff0020 t1
	csrr    t0 uscratch     	# восстановим t0, а t1 не будем))
        uret
